home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 27 / CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso / CUCD / Programming / BlitzC2P / c2p040plus.ascii < prev    next >
Text File  |  1998-08-01  |  8KB  |  449 lines

  1. WBStartup
  2. NoCli
  3.  
  4. ; 030/50 results:
  5.  
  6. ; 320x200 @24.3fps PAL
  7. ; 320x256 @18.5fps PAL
  8.  
  9. ; 040/25 results:
  10.  
  11. ; 320x200 @46fps DoublePAL or 49.2fps PAL
  12. ; 320x256 @34.2fps DoublePAL or 37.9fps PAL
  13. ; 320x240 @37fps DoublePAL or 40.6fps PAL
  14.  
  15. ; 060/50 results:
  16.  
  17. ; 320x256 @50fps PAL
  18. ; 320x200 @66fps PAL
  19.  
  20. #c2pBPLX=320
  21. #c2pBPLY=256
  22. #c2pBPLSIZE=(#c2pBPLX*#c2pBPLY)/8
  23.  
  24. #scrwidth=#c2pBPLX
  25. #scrheight=#c2pBPLY
  26. #screensize=#scrwidth*#scrheight
  27.  
  28. ; Date: 20-Jan-1998     Mikael Kalms (Scout/C-Lous & more)
  29. ;         Email: mikael@kalms.org
  30. ;
  31. ; About:
  32. ;   1x1 8bpl cpu5 C2P for contigous bitplanes and no horizontal modulo
  33. ;
  34. ;   This routine is intended for use on all 68040 and 68060 based systems.
  35. ;   It is not designed to perform well on 68020-030.
  36. ;
  37. ;   This routine is released into the public domain. It may be freely used
  38. ;   for non-commercial as well as commercial purposes. A short notice via
  39. ;   email is always appreciated, though.
  40. ;
  41. ; Timings:
  42. ;   ~130% on (a1200 Blizzard) 040-25
  43. ;   Estimated to run at copyspeed on 040-40 and 060
  44. ;
  45. ; Features:
  46. ;   Performs CPU-only C2P conversion using rather state-of-the-art (as of
  47. ;   the creation date, anyway) techniques
  48. ;   Handles bitplanes creens of virtually any size (4GB)
  49. ;
  50. ; Restrictions:
  51. ;   Chunky-buffer must be an even multiple of 32 pixels wide
  52. ;   If incorrect/invalid parameters are specified, the routine will
  53. ;   most probably crash.
  54. ;
  55. ; c2p1x1_8_c5_040_init      sets only the chunkybuffer size/pos
  56. ; c2p1x1_8_c5_040     performs the actual c2p conversion
  57. ;
  58.  
  59. Statement c2p040init{A.l,B.l}
  60.  
  61.   ;A.l=d0=Width.w
  62.   ;B.l=d1=Height.w
  63.  
  64. ; d0.w  chunkyx [chunky-pixels]
  65. ; d1.w  chunkyy [chunky-pixels]
  66. ; d3.w  scroffsy [screen-pixels]
  67.  
  68.   MOVEQ.l #0,d3 ; Y offset
  69.  
  70. _c2p1x1_8_c5_040_init
  71. c2p1x1_8_c5_040_init
  72.   MULU.w  d0,d3
  73.   LSR.l #3,d3
  74.   MOVE.l  d3,c2p1x1_8_c5_040_scroffs
  75.   MULU.w  d0,d1
  76.   MOVE.l  d1,c2p1x1_8_c5_040_pixels
  77. AsmExit
  78. End Statement
  79.  
  80. Statement c2p040{A.l,B.l}
  81.  
  82.   MOVE.l  d0,a0 ; Chunky
  83.   MOVE.l  d1,a1 ; Planar
  84.  
  85. ; a0  c2pscreen
  86. ; a1  bitplanes
  87. #_LVOCacheClearU=-$27C
  88. #execbase=$4
  89. _c2p1x1_8_c5_040
  90. c2p1x1_8_c5_040
  91.   MOVEM.l a3-a6,-(a7)
  92.  
  93.   ADD.l #c2pBPLSIZE*7,a1
  94.   ADD.l c2p1x1_8_c5_040_scroffs,a1
  95.  
  96.   MOVE.l  c2p1x1_8_c5_040_pixels,a2
  97.   MOVE.l  a2,d0 ; byPWest
  98.   TST.l d0 ;
  99.   BEQ _none
  100.   ADD.l a0,a2
  101.  
  102.   MOVE.l  (a0)+,d0
  103.   MOVE.l  (a0)+,d1
  104.   MOVE.l  (a0)+,d2
  105.   MOVE.l  (a0)+,d3
  106.   MOVE.l  (a0)+,d4
  107.   MOVE.l  (a0)+,d5
  108.   MOVE.l  (a0)+,a5
  109.   MOVE.l  (a0)+,a6
  110.  
  111.   SWAP  d4      ; Swap 16x4, part 1
  112.   SWAP  d5
  113.   EOR.w d0,d4
  114.   EOR.w d1,d5
  115.   EOR.w d4,d0
  116.   EOR.w d5,d1
  117.   EOR.w d0,d4
  118.   EOR.w d1,d5
  119.   SWAP  d4
  120.   SWAP  d5
  121.  
  122.   MOVE.l  d4,d6     ; Swap 2x4, part 1
  123.   MOVE.l  d5,d7
  124.   LSR.l #2,d6
  125.   LSR.l #2,d7
  126.   EOR.l d0,d6
  127.   EOR.l d1,d7
  128.   AND.l #$33333333,d6
  129.   AND.l #$33333333,d7
  130.   EOR.l d6,d0
  131.   EOR.l d7,d1
  132.   LSL.l #2,d6
  133.   LSL.l #2,d7
  134.   EOR.l d6,d4
  135.   EOR.l d7,d5
  136.  
  137.   EXG d4,a5
  138.   EXG d5,a6
  139.  
  140.   SWAP  d4      ; Swap 16x4, part 2
  141.   SWAP  d5
  142.   EOR.w d2,d4
  143.   EOR.w d3,d5
  144.   EOR.w d4,d2
  145.   EOR.w d5,d3
  146.   EOR.w d2,d4
  147.   EOR.w d3,d5
  148.   SWAP  d4
  149.   SWAP  d5
  150.  
  151.   MOVE.l  d4,d6     ; Swap 2x4, part 1
  152.   MOVE.l  d5,d7
  153.   LSR.l #2,d6
  154.   LSR.l #2,d7
  155.   EOR.l d2,d6
  156.   EOR.l d3,d7
  157.   AND.l #$33333333,d6
  158.   AND.l #$33333333,d7
  159.   EOR.l d6,d2
  160.   EOR.l d7,d3
  161.   LSL.l #2,d6
  162.   LSL.l #2,d7
  163.   EOR.l d6,d4
  164.   EOR.l d7,d5
  165.  
  166.   MOVE.l  d1,d6     ; Swap 4x1, part 1
  167.   MOVE.l  d3,d7
  168.   LSR.l #4,d6
  169.   LSR.l #4,d7
  170.   EOR.l d0,d6
  171.   EOR.l d2,d7
  172.   AND.l #$0f0f0f0f,d6
  173.   AND.l #$0f0f0f0f,d7
  174.   EOR.l d6,d0
  175.   EOR.l d7,d2
  176.   LSL.l #4,d6
  177.   LSL.l #4,d7
  178.   EOR.l d6,d1
  179.   EOR.l d7,d3
  180.  
  181.   BRA _start
  182.  
  183.   Even8
  184.   Even8
  185. _x
  186.   MOVE.l  (a0)+,d0
  187.   MOVE.l  (a0)+,d1
  188.   MOVE.l  (a0)+,d2
  189.   MOVE.l  (a0)+,d3
  190.   MOVE.l  (a0)+,d4
  191.   MOVE.l  (a0)+,d5
  192.   MOVE.l  (a0)+,a5
  193.   MOVE.l  (a0)+,a6
  194.  
  195.   MOVE.l  d6,(a1)
  196.   SUB.l #c2pBPLSIZE*4,a1
  197.  
  198.   SWAP  d4      ; Swap 16x4, part 1
  199.   SWAP  d5
  200.   EOR.w d0,d4
  201.   EOR.w d1,d5
  202.   EOR.w d4,d0
  203.   EOR.w d5,d1
  204.   EOR.w d0,d4
  205.   EOR.w d1,d5
  206.   SWAP  d4
  207.   SWAP  d5
  208.  
  209.   MOVE.l  d7,(a1)
  210.   ADD.l #c2pBPLSIZE*3,a1
  211.  
  212.   MOVE.l  d4,d6     ; Swap 2x4, part 1
  213.   MOVE.l  d5,d7
  214.   LSR.l #2,d6
  215.   LSR.l #2,d7
  216.   EOR.l d0,d6
  217.   EOR.l d1,d7
  218.   AND.l #$33333333,d6
  219.   AND.l #$33333333,d7
  220.   EOR.l d6,d0
  221.   EOR.l d7,d1
  222.   LSL.l #2,d6
  223.   LSL.l #2,d7
  224.   EOR.l d6,d4
  225.   EOR.l d7,d5
  226.  
  227.   EXG d4,a5
  228.   EXG d5,a6
  229.  
  230.   SWAP  d4      ; Swap 16x4, part 2
  231.   SWAP  d5
  232.   EOR.w d2,d4
  233.   EOR.w d3,d5
  234.   EOR.w d4,d2
  235.   EOR.w d5,d3
  236.   EOR.w d2,d4
  237.   EOR.w d3,d5
  238.   SWAP  d4
  239.   SWAP  d5
  240.  
  241.   MOVE.l  a3,(a1)
  242.   SUB.l #c2pBPLSIZE*4,a1
  243.  
  244.   MOVE.l  d4,d6     ; Swap 2x4, part 1
  245.   MOVE.l  d5,d7
  246.   LSR.l #2,d6
  247.   LSR.l #2,d7
  248.   EOR.l d2,d6
  249.   EOR.l d3,d7
  250.   AND.l #$33333333,d6
  251.   AND.l #$33333333,d7
  252.   EOR.l d6,d2
  253.   EOR.l d7,d3
  254.   LSL.l #2,d6
  255.   LSL.l #2,d7
  256.   EOR.l d6,d4
  257.   EOR.l d7,d5
  258.  
  259.   MOVE.l  d1,d6     ; Swap 4x1, part 1
  260.   MOVE.l  d3,d7
  261.   LSR.l #4,d6
  262.   LSR.l #4,d7
  263.   EOR.l d0,d6
  264.   EOR.l d2,d7
  265.   AND.l #$0f0f0f0f,d6
  266.   AND.l #$0f0f0f0f,d7
  267.   EOR.l d6,d0
  268.   EOR.l d7,d2
  269.   LSL.l #4,d6
  270.   LSL.l #4,d7
  271.   EOR.l d6,d1
  272.   EOR.l d7,d3
  273.  
  274.   MOVE.l  a4,(a1)
  275.   ADD.l #c2pBPLSIZE*7+4,a1
  276.  
  277. _start
  278.   MOVE.l  d2,d6     ; Swap 8x2, part 1
  279.   MOVE.l  d3,d7
  280.   LSR.l #8,d6
  281.   LSR.l #8,d7
  282.   EOR.l d0,d6
  283.   EOR.l d1,d7
  284.   AND.l #$00ff00ff,d6
  285.   AND.l #$00ff00ff,d7
  286.   EOR.l d6,d0
  287.   EOR.l d7,d1
  288.   LSL.l #8,d6
  289.   LSL.l #8,d7
  290.   EOR.l d6,d2
  291.   EOR.l d7,d3
  292.  
  293.   MOVE.l  d2,d6     ; Swap 1x2, part 1
  294.   MOVE.l  d3,d7
  295.   LSR.l #1,d6
  296.   LSR.l #1,d7
  297.   EOR.l d0,d6
  298.   EOR.l d1,d7
  299.   AND.l #$55555555,d6
  300.   AND.l #$55555555,d7
  301.   EOR.l d6,d0
  302.   EOR.l d7,d1
  303.   LSL.l #1,d6
  304.   LSL.l #1,d7
  305.   EOR.l d6,d2
  306.   EOR.l d7,d3
  307.  
  308.   MOVE.l  d0,(a1)
  309.   SUB.l #c2pBPLSIZE*4,a1
  310.  
  311.   MOVE.l  a5,d6
  312.   MOVE.l  a6,d7
  313.   MOVE.l  d2,a3
  314.   MOVE.l  d3,a4
  315.  
  316.   MOVE.l  d5,d2     ; Swap 4x1, part 2
  317.   MOVE.l  d7,d3
  318.   LSR.l #4,d2
  319.   LSR.l #4,d3
  320.   EOR.l d4,d2
  321.   EOR.l d6,d3
  322.   AND.l #$0f0f0f0f,d2
  323.   AND.l #$0f0f0f0f,d3
  324.   EOR.l d2,d4
  325.   EOR.l d3,d6
  326.  
  327.   MOVE.l  d1,(a1)
  328.   ADD.l #c2pBPLSIZE*3,a1
  329.  
  330.   LSL.l #4,d2
  331.   LSL.l #4,d3
  332.   EOR.l d2,d5
  333.   EOR.l d3,d7
  334.  
  335.   MOVE.l  d4,d2     ; Swap 8x2, part 2
  336.   MOVE.l  d5,d3
  337.   LSR.l #8,d2
  338.   LSR.l #8,d3
  339.   EOR.l d6,d2
  340.   EOR.l d7,d3
  341.   AND.l #$00ff00ff,d2
  342.   AND.l #$00ff00ff,d3
  343.   EOR.l d2,d6
  344.   EOR.l d3,d7
  345.  
  346.   MOVE.l  a3,(a1)
  347.   SUB.l #c2pBPLSIZE*4,a1
  348.  
  349.   LSL.l #8,d2
  350.   LSL.l #8,d3
  351.   EOR.l d2,d4
  352.   EOR.l d3,d5
  353.  
  354.   MOVE.l  d4,d2     ; Swap 1x2, part 2
  355.   MOVE.l  d5,d3
  356.   LSR.l #1,d2
  357.   LSR.l #1,d3
  358.   EOR.l d6,d2
  359.   EOR.l d7,d3
  360.   AND.l #$55555555,d2
  361.   AND.l #$55555555,d3
  362.  
  363.   MOVE.l  a4,(a1)
  364.   ADD.l #c2pBPLSIZE*3,a1
  365.  
  366.   EOR.l d2,d6
  367.   EOR.l d3,d7
  368.   LSL.l #1,d2
  369.   LSL.l #1,d3
  370.   EOR.l d2,d4
  371.   EOR.l d3,d5
  372.  
  373.   MOVE.l  d4,a3
  374.   MOVE.l  d5,a4
  375.  
  376.   CMP.l a0,a2
  377.   BNE _x
  378.  
  379.   MOVE.l  d6,(a1)
  380.   SUB.l #c2pBPLSIZE*4,a1
  381.   MOVE.l  d7,(a1)
  382.   ADD.l #c2pBPLSIZE*3,a1
  383.   MOVE.l  a3,(a1)
  384.   SUB.l #c2pBPLSIZE*4,a1
  385.   MOVE.l  a4,(a1)
  386.  
  387. _none: MOVEM.l (a7)+,a3-a6
  388. AsmExit
  389.  
  390. Even4
  391. c2p1x1_8_c5_040_scroffs: Dc.l 0
  392. c2p1x1_8_c5_040_pixels: Dc.l 0
  393. End Statement
  394.  
  395.  
  396.  
  397.  
  398.  
  399. .blitzprogram
  400. ; Setup
  401. InitBank 0,(#scrwidth*#scrheight)+1000,2|65536 ; Chipram planar buffer
  402. CludgeBitMap 0,#scrwidth,#scrheight,8,Bank(0)
  403. InitPalette 0,256
  404. For c=0 To 255
  405.   AGAPalRGB 0,c,Rnd(c),Rnd(c),Rnd(c)
  406. Next c
  407. AGAPalRGB 0,0,0,0,0
  408. Screen 0,0,0,#scrwidth,#scrheight,8,0,"c2p test",0,0,0
  409. Use Palette 0
  410. VWait 50
  411. baseaddress1.l=AllocMem(#scrwidth*#scrheight,$10000) ; Fastram chunky buffer
  412.  
  413. ; Put something into the chunky buffer so we can see it working
  414. GetReg a0,baseaddress1
  415. MOVE.l  #0,d0
  416. MOVE.l  #screensize-1,d1
  417. cloop
  418.   MOVE.b  d0,(a0)+
  419.   ADDQ.l  #1,d0
  420.   SUBQ.l  #1,d1
  421.   TST.l   d1
  422.   BLT     done
  423.   BRA     cloop
  424. done
  425.  
  426. ; Do the c2p test
  427. c2p040init{#scrwidth,#scrheight}
  428. VWait 20
  429. Forbid_
  430. VWait
  431. ResetTimer
  432. For time=1 To 800
  433.   c2p040{baseaddress1,Bank(0)} ; Convert chunky to planar
  434. Next time
  435. t=Ticks
  436. VWait 2 : Permit_
  437. VWait 20
  438. FindScreen 0
  439. Window 0,0,11,640,100,0,"Test results for c2p",0,0
  440. WindowOutput 0
  441. NPrint "Routine performed @ ",50/(t/800),"fps - ",t," ticks"
  442. NPrint " "
  443. NPrint "Press mousebutton..."
  444. Free Screen 0
  445. MouseWait
  446. Free Window 0
  447. End
  448.  
  449.